home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / pc / files / dsp / fteyaltr.z / fteyaltr / fft2.pc < prev    next >
Text File  |  1991-08-31  |  5KB  |  204 lines

  1. /*--------------------------- fft2.c ---------------------------------- */
  2. /*                                    */
  3. /* Author:    Eyal Lebedinsky                        */
  4. /* Date:    May 1990                        */
  5. /* Version:    25 August 1991                        */
  6. /*                                    */
  7. /* Example for using the output of fftg.c                */
  8. /* To use this program you need to provide at least:            */
  9. /*    move(x,y)                            */
  10. /*    draw(x,y,WHITE)                            */
  11. /* Where x is 0-535 and y is 0-345 (or scale the constants...)        */
  12. /* lines markes as *video* are graphics related.            */
  13. /*                                    */
  14. /* Warning:                                */
  15. /*    This program uses 'scanf' et. al. which may not work properly    */
  16. /*    in some environments!                        */
  17. /*                                    */
  18. /* This program is released into the public domain.            */
  19. /*                                    */
  20. /*----------------------------------------------------------------------*/
  21.  
  22. #include <stdio.h>
  23.  
  24. #define SC15 32768
  25.  
  26. #include <graph.h>                /*video*/
  27. #define move(x,y)    _moveto (x, y)        /*video*/
  28. #define draw(x,y,c)    _lineto (x, y)        /*video*/
  29. #define clear_screen    _clearscreen (_GCLEARSCREEN);        /*video*/
  30. static struct videoconfig vc;            /*video*/
  31.  
  32. #define M 8
  33. #define N (1 << M)
  34.  
  35. short x[N] = {0};                /* fp(16,0)  */
  36. short qf[(N/2)+1] = {0};            /* fp(16,0)  */
  37. extern void FAR fft ();
  38.  
  39. static long in[N];                /* fp(32,0)  */
  40.  
  41. main (argc)
  42. int    argc;
  43. {
  44.    int i, j, k, m, n;
  45.    short dd, dh, dl, y, t ,o;            /* fp(16,0)  */
  46.    long  bf, qq, fff, yl, mf;            /* fp(32,0)  */
  47.    int tmp;
  48.    char ns[30], fname[35];
  49.    FILE *fin;
  50.  
  51.    /* initialise   */
  52.  
  53.    m = M;
  54.    n = 1 << m;
  55.  
  56.    if (_setvideomode (_HERCMONO) == 0) {    /*video*/
  57.       printf ("cannot set HERCMONO mode.\n");    /*video*/
  58.       exit (4);                    /*video*/
  59.    }                        /*video*/
  60.    _getvideoconfig (&vc);            /*video*/
  61.  
  62.    /* end initialise */
  63.  
  64. again:
  65.  
  66.    printf ("\n\n\nWHICH DATA FILE TO BE USED ");
  67.    scanf (" %s", ns);
  68.    if (strcmp (ns, "end") == 0) {
  69.       _setvideomode (_DEFAULTMODE);        /*video*/
  70.       exit (0);
  71.    }
  72.    if (*ns == '\0')
  73.       strcpy (ns, "D1");
  74.  
  75.    strcpy (fname, ns);
  76.    strcat (fname, ".fft");
  77.    fin = fopen (fname, "r");
  78.    if (fin == NULL) {
  79.       perror (fname);
  80.       goto again;
  81.    }
  82.  
  83.    fscanf (fin, " %u", &i);            /* ignore count */
  84.  
  85.    fscanf (fin, " %d", &tmp);
  86.    mf = dh = dl = in[0] = dd = tmp;
  87.  
  88.    for (i = 1; i < n; ++i) {
  89.       fscanf (fin, " %d", &tmp);
  90.       mf += in[i] = dd = tmp;
  91.       if (dd > dh) dh = dd;
  92.       if (dd < dl) dl = dd;
  93.    }
  94.    fclose (fin);
  95.  
  96.    y = mf / n;
  97.  
  98.    qq = (long)dh - (long)dl;
  99.    if (qq != 0) {                /* scale to maximum */
  100.       for (i = 0; qq < SC15; ++i, qq <<= 1);
  101.    }
  102.    else
  103.       i = 0;
  104.  
  105.    for (j = 0; j < n; ++j)
  106.       x[j] = (in[j] - y) << i;
  107.  
  108.    /* end preprocessing */
  109.  
  110.    clear_screen;
  111.  
  112.    move (15,     40*2);
  113.    draw (15+512, 40*2, WHITE);
  114.    draw (15+512, 1, WHITE);
  115.    draw (15,     1, WHITE);
  116.    draw (15,     40*2, WHITE);
  117.  
  118.    move (15, 40);
  119.    for (i = 0; i < n; ++i)
  120.       draw (16 + i + i, 40 - (x[i] >> 10), WHITE);
  121.  
  122.    move (15,       330);        /* X axis */
  123.    draw (15+13*40, 330, WHITE);
  124.    for (i = 0; i <= 130*4; i += 4) {
  125.       move (15+i, 330);
  126.       if (i%(50*4) == 0)        /* every 50 */
  127.      draw (15+i, 330+15, WHITE);
  128.       else if (i%(10*4) == 0)        /* every 10 */
  129.      draw (15+i, 330+10, WHITE);
  130.       else if (i%(5*4) == 0)        /* every 5  */
  131.      draw (15+i, 330+5, WHITE);
  132.       else                /* every 1  */
  133.      draw (15+i, 330+2, WHITE);
  134.    }
  135.  
  136.    move (15,     330);            /* Y axis */
  137.    draw (15, 330-220, WHITE);
  138.    for (i = 0; i <= 220; i += 220/10) {
  139.       move (15,            330-i);
  140.       draw ((i%5) ? 15-5 : 15-10, 330-i, WHITE);
  141.    }
  142.  
  143.    /* end screen layout */
  144.  
  145.    if (argc > 1) {
  146.        short    xx[256];
  147.        long    lapse;
  148.  
  149.     memcpy (xx, x, sizeof (xx));
  150.     lapse = time (NULL);
  151.     for (i = 0; i < 10000; ++i) {
  152.         memcpy (x, xx, sizeof (x));
  153.         if (argc < 3)
  154.             fft ();
  155.     }
  156.     lapse = time (NULL) - lapse;
  157.     printf ("time: %lu\n", lapse);
  158.     memcpy (x, xx, sizeof (x));
  159.    }
  160.  
  161.    fft ();
  162.  
  163. /*
  164.    for (i = 0; i <= n/2; ++i) {
  165.       printf ("%3u= %5d ", i, qf[i]);
  166.       if (!(i % 5))
  167.           printf ("\n");
  168.    }
  169.    printf ("\n");
  170. */
  171.  
  172.    t = 0;
  173.    for (i = 1; i < n; ++i) {
  174.       if (t < abs (x[i]))
  175.      t = abs (x[i]);
  176.    }
  177.    printf ("mx=%d\n", t);
  178.  
  179.    k = 0;
  180.    t = 0;
  181.    for (i = 1; i <= n/2; ++i) {
  182.       if (t < qf[i])
  183.      t = qf[i];
  184.       qf[i] = isqrt ((long)qf[i]);
  185.       if (k < qf[i])
  186.      k = qf[i];
  187.    }
  188.    printf ("mq=%d\n", t);
  189.  
  190.    if (k == 0)
  191.        k = 1;
  192.  
  193.    t = 15;   o = 1 << (10 - m);
  194.    for (i = 1; i <= (n/2); ++i) {
  195.       j  = (qf[i] * 220L) / k;
  196.       t = t + o;
  197.       move (t, 330);
  198.       draw (t, 330 -  j, WHITE);
  199.    }
  200.  
  201.    goto again;
  202. }
  203.  
  204.